package com.css.openapi.BO.fxdw;


import com.css.common.core.constant.ValidGroup;
import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;

/**
 * @description: 反向开票订单BO
 * @Title: FxkpOrderBO
 * @Author xlw
 * @Package com.invoice.tcc.BO.fxdw
 * @Date 2024/11/19 15:19
 */
@Data
public class FxkpOrderBO {

    /**
     * 商户绑定编号
     */
    @NotBlank(message = "商户绑定编号不能为空")
    private String shbdbh;

    /**
     * 开票员绑定编号
     */
    @NotBlank(message = "开票员绑定编号不能为空")
    private String kpybdbh;

    /**
     * 业务类型
     */
    @NotBlank(message = "业务类型不能为空")
    private String ywlx;

    /**
     * 发票票种代码
     * 01：增值税专用发票
     * 02：普通发票
     */
    @NotBlank(message = "发票票种代码不能为空")
    private String fppzDm;

    /**
     * 业务流水号
     */
    @NotBlank(message = "业务流水号不能为空")
    private String ywlsh;

    /**
     * 支付开票确认方式
     * * 默认：01
     * 01：无需确认支付，无需确认开票（自动支付并开票）
     * 02：需确认后支付，无需确认开票（确认支付后自动开票）
     * 03：无需确认支付，需确认后开票（自动支付，确认后开票）
     * 04：需确认支付，需确认开票（先确认后支付，再确认后开票）
     */
    private String zfkpqrfs = "01";

    /**
     * 自然人姓名
     */
    @NotBlank(message = "自然人姓名不能为空")
    private String zrrxm;

    /**
     * 自然人身份证件号码
     */
    @NotBlank(message = "自然人身份证件号码不能为空")
    private String zrrsfzjhm;

    /**
     * 自然人手机号码
     */
    @NotBlank(message = "自然人手机号码不能为空", groups = ValidGroup.FPSG.class)
    private String zrrsjhm;

    /**
     * 自然人收款银行账号
     */
    @NotBlank(message = "自然人收款银行账号不能为空")
    private String zrryhzh;

    /**
     * 自然人居住地址
     */
    @NotBlank(message = "自然人居住地址不能为空", groups = ValidGroup.LHYG.class)
    private String zrrjzdz;//填写自然人销售方居住地信息，必须为“行政区划数字代码对应的地址+街道乡镇代码对应的街道乡镇名称+销售方详细地址”组合

    /**
     * 自然人居住地址行政区划数字代码
     */
    @Size(max = 6, min = 6, message = "自然人居住地址行政区划数字代码长度必须为6")
    private String zrrjzdzXzqhszDm;

    /**
     * 自然人居住地址街道乡镇代码
     */
    @Size(max = 9, min = 9, message = "自然人居住地址街道乡镇代码长度必须为9")
    private String zrrjzdzJdxzDm;

    /**
     * 自然人居住地址详细地址
     */
    private String zrrjzdzXxdz;//除标准行政区划（省份、地市、区县、乡镇街道）外详细地址

    /**
     * 减按征税类型代码
     * 放弃免税、3%减按1%开票优惠政策原因代码，可选54、55、空。
     * 空：使用1%或免税开票
     * 54：前期已开具3%征收率的发票，发生销售折让、中止或者退回等情形需要开具3%征收率的红字发票，或者开票有误需要重新开具3%征收率的发票；
     * 55：因为实际经营业务需要，放弃享受减按1%征收率征收增值税政策；
     */
    private String jazslxDm;

    /**
     * 税费承担方（默认01）
     * 01：自然人承担（转账金额=总金额-个税增值税及附加税费合计）
     * 02：企业承担税费（转账金额=总金额）
     */
    private String sfcdf;

    /**
     * 个人所得税项目（灵活用工必传）
     * 1：财产转让所得
     * 2：经营所得
     * 3：劳务报酬
     * 4：特许权使用费
     * 5：稿酬
     */
    private String grsdsxm;

    /**
     * 发票备注
     */
    private String fpbz;

    /**
     * 开票通知回调地址
     */
    private String kptzhddz;

    /**
     * 支付通知回调地址
     */
    private String zftzhddz;

    /**
     * 开户银行所在省份代码
     */
    @NotBlank(message = "自然人手机号码不能为空", groups = ValidGroup.FPSG.class)
    private String khyhszsf;

    /**
     * 支付凭证
     */
    @Valid
    @NotNull(message = "支付凭证不能为空", groups = ValidGroup.MAOTAI.class)
    private ZfpzxxBO zfpzxx;

    /**
     * 业务订单明细
     */
    @Valid
    @NotEmpty(message = "业务订单明细不能为空")
    private List<YwddmxBO> ywddmx;
}
